Greatest sum divisible by three

Time: O(N); Space: O(1); medium

Given an array nums of integers, we need to find the maximum possible sum of elements of the array such that it is divisible by three.

Example 1:

Input: nums = [3,6,5,1,8]

Output: 18

Explanation:

  • Pick numbers 3, 6, 1 and 8 their sum is 18 (maximum sum divisible by 3).

Example 2:

Input: nums = [4]

Output: 0

Explanation:

  • Since 4 is not divisible by 3, do not pick any number.

Example 3:

Input: nums = [1,2,3,4,4]

Output: 12

Explanation:

  • Pick numbers 1, 3, 4 and 4 their sum is 12 (maximum sum divisible by 3).

Constraints:

  • 1 <= len(nums) <= 4 * 10^4

  • 1 <= nums[i] <= 10^4

Hints:

  1. Represent the state as DP[pos][mod]: maximum possible sum starting in the position “pos” in the array where the current sum modulo 3 is equal to mod.

1. Dynamic programming [O(N), O(1)]

[1]:
class Solution1(object):
    """
    Time: O(N)
    Space: O(1)
    """
    def maxSumDivThree(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        dp = [0, 0, 0]

        for num in nums:
            for i in [num+x for x in dp]:
                dp[i%3] = max(dp[i%3], i)

        return dp[0]
[2]:
s = Solution1()

nums = [3,6,5,1,8]
assert s.maxSumDivThree(nums) == 18

nums = [4]
assert s.maxSumDivThree(nums) == 0

nums = [1,2,3,4,4]
assert s.maxSumDivThree(nums) == 12